package com.freak.freakmusic.app.api

import com.ximalaya.ting.android.opensdk.constants.DTransferConstants
import com.ximalaya.ting.android.opensdk.datatrasfer.CommonRequest
import com.ximalaya.ting.android.opensdk.datatrasfer.IDataCallBack
import com.ximalaya.ting.android.opensdk.model.PostResponse
import com.ximalaya.ting.android.opensdk.model.album.*
import com.ximalaya.ting.android.opensdk.model.announcer.AnnouncerCategoryList
import com.ximalaya.ting.android.opensdk.model.announcer.AnnouncerList
import com.ximalaya.ting.android.opensdk.model.banner.BannerV2List
import com.ximalaya.ting.android.opensdk.model.banner.CategoryBannerList
import com.ximalaya.ting.android.opensdk.model.banner.DiscoveryBannerList
import com.ximalaya.ting.android.opensdk.model.banner.RankBannerList
import com.ximalaya.ting.android.opensdk.model.category.CategoryList
import com.ximalaya.ting.android.opensdk.model.coldboot.ColdBootDetail
import com.ximalaya.ting.android.opensdk.model.coldboot.ColdBootTag
import com.ximalaya.ting.android.opensdk.model.coldboot.GenreList
import com.ximalaya.ting.android.opensdk.model.coldboot.SubGenreList
import com.ximalaya.ting.android.opensdk.model.column.ColumnDetail
import com.ximalaya.ting.android.opensdk.model.column.ColumnList
import com.ximalaya.ting.android.opensdk.model.download.RecommendDownload
import com.ximalaya.ting.android.opensdk.model.history.PlayHistoryList
import com.ximalaya.ting.android.opensdk.model.live.program.ProgramList
import com.ximalaya.ting.android.opensdk.model.live.provinces.ProvinceList
import com.ximalaya.ting.android.opensdk.model.live.radio.*
import com.ximalaya.ting.android.opensdk.model.live.schedule.ScheduleList
import com.ximalaya.ting.android.opensdk.model.metadata.MetaDataList
import com.ximalaya.ting.android.opensdk.model.pay.BoughtStatuList
import com.ximalaya.ting.android.opensdk.model.pay.OrderDetail
import com.ximalaya.ting.android.opensdk.model.pay.PayOderStatue
import com.ximalaya.ting.android.opensdk.model.ranks.RankAlbumList
import com.ximalaya.ting.android.opensdk.model.ranks.RankList
import com.ximalaya.ting.android.opensdk.model.ranks.RankTrackList
import com.ximalaya.ting.android.opensdk.model.search.SearchAll
import com.ximalaya.ting.android.opensdk.model.tag.TagList
import com.ximalaya.ting.android.opensdk.model.track.*
import com.ximalaya.ting.android.opensdk.model.user.XmBaseUserInfo
import com.ximalaya.ting.android.opensdk.model.user.XmUserInfo
import com.ximalaya.ting.android.opensdk.model.word.HotWordList
import com.ximalaya.ting.android.opensdk.model.word.SuggestWords
import org.xutils.common.util.LogUtil

class ApiService {
    /********************************** 3.2 点播数据接口 ***********************************/
    /**
     * 3.2.1 获取喜马拉雅内容分类
     */
    fun getCategories() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getCategories(specificParams, object : IDataCallBack<CategoryList> {
            override fun onSuccess(p0: CategoryList?) {
                LogUtil.d("获取成功" + p0!!.categories.toString())
                val stringBuffer = StringBuffer()
                for (item in p0.categories) {
                    stringBuffer.append("名称--》").append(item.categoryName).append("\n")
                }
                LogUtil.e("分类数据\n${stringBuffer.toString()}")
            }

            override fun onError(p0: Int, p1: String?) {
                LogUtil.d("获取失败" + p0 + p1)
            }
        }
        )
    }

    /**
     * 3.2.2 获取专辑标签或者声音标签
     * @param category_id 分类ID，指定分类，为0时表示热门分类
     * @param type 指定查询的是专辑标签还是声音标签，0-专辑标签，1-声音标签
     */
    fun getTags(category_id: Int, type: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.TYPE] = 0.toString()
        CommonRequest.getTags(specificParams, object : IDataCallBack<TagList> {
            override fun onSuccess(p0: TagList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.3 根据分类和标签获取某个分类某个标签下的专辑列表（最火/最新/最多播放）
     * @param category_id 分类ID，指定分类，为0时表示热门分类
     * @param tag_name 分类下对应的专辑标签，不填则为热门分类
     * @param calc_dimension 计算维度，现支持最火（1），最新（2），经典或播放最多（3）
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getAlbumList(
        category_id: Int,
        tag_name: String,
        calc_dimension: Int,
        page: Int,
        count: Int
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.TAG_NAME] = tag_name
        specificParams[DTransferConstants.CALC_DIMENSION] = calc_dimension.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getAlbumList(specificParams, object : IDataCallBack<AlbumList> {
            override fun onSuccess(p0: AlbumList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }


        })
    }

    /**
     * 3.2.4 专辑浏览，根据专辑ID获取专辑下的声音列表
     * @param album_id 专辑ID
     * @param sort    sort String 否 "asc"表示喜马拉雅正序，"desc"表示喜马拉雅倒序，"time_asc"表示时间升序，"time_desc"表示时间降序，默认为"asc"
     * @param page 当前第几页，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getTracks(album_id: Int, sort: String, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ALBUM_ID] = album_id.toString()
        specificParams[DTransferConstants.SORT] = sort
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getTracks(specificParams, object : IDataCallBack<TrackList> {
            override fun onSuccess(p0: TrackList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.5 批量获取专辑列表
     * @param ids 专辑ID列表，用英文逗号分隔，比如"1000,1010" 最大ID数量为200个，超过200的ID将忽略
     */
    fun getBatch(ids: String) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ALBUM_IDS] = ids
        CommonRequest.getBatch(specificParams, object : IDataCallBack<BatchAlbumList> {
            override fun onSuccess(p0: BatchAlbumList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.6 根据专辑ID列表批获取量专辑更新提醒信息列表
     * @param ids 专辑ID列表，用英文逗号分隔，比如"1000,1010" 最大ID数量为200个，超过200的ID将忽略
     */
    fun getUpdateBatch(ids: String) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ALBUM_IDS] = ids
        CommonRequest.getUpdateBatch(specificParams, object : IDataCallBack<UpdateBatchList> {
            override fun onSuccess(p0: UpdateBatchList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.7 根据分类和标签获取热门声音列表
     * @param category_id 分类ID，指定分类
     * @param tag_name 分类下对应声音标签，不填则为热门分类
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getHotTracks(category_id: Int, tag_name: String, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.TAG_NAME] = tag_name
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getHotTracks(specificParams, object : IDataCallBack<TrackHotList> {
            override fun onSuccess(p0: TrackHotList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.8 批量获取声音列表
     * @param ids 声音ID列表 最大ID数量为200个，超过200的ID将忽略
     */
    fun getBatchTracks(ids: String) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.TRACK_IDS] = ids
        CommonRequest.getBatchTracks(specificParams, object : IDataCallBack<BatchTrackList> {
            override fun onSuccess(p0: BatchTrackList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.9 根据上一次所听声音的id，获取此声音所在那一页的声音
     * @param album_id 专辑id
     *@param track_id 声音id
     * @param count 每页大小，范围为[1,200]，默认为20
     * @param sort 返回结果排序方式： "asc" - 喜马拉雅正序，"desc" - 喜马拉雅倒序，默认为"asc"
     * @param contains_paid 是否是付费声音 (如果是付费相关的专辑调用此函数需要设置contain_paid 为true)
     */
    fun getLastPlayTracks(
        album_id: Long,
        track_id: Long,
        count: Int,
        sort: String,
        contains_paid: Boolean
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ALBUM_ID] = album_id.toString()
        specificParams[DTransferConstants.TRACK_ID] = track_id.toString()
        specificParams["count"] = count.toString()
        specificParams[DTransferConstants.SORT] = sort.toString()
        specificParams[DTransferConstants.CONTAINS_PAID] = contains_paid.toString()
        CommonRequest.getLastPlayTracks(specificParams, object : IDataCallBack<LastPlayTrackList> {
            override fun onSuccess(p0: LastPlayTrackList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.10 根据分类和标签获取某个分类某个标签下的专辑列表（最火/最新/最多播放） (已过时)
     * @param category_id 分类ID，指定分类，为0时表示热门分类
     * @param tag_name 分类下对应的专辑标签，不填则为热门分类
     * @param calc_dimension 计算维度，现支持最火（1），最新（2），经典或播放最多（3）
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getUpToDateAlbums(
        category_id: Int,
        tag_name: String,
        calc_dimension: Int,
        page: Int,
        count: Int
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.TAG_NAME] = tag_name
        specificParams[DTransferConstants.CALC_DIMENSION] = calc_dimension.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getUpToDateAlbums(specificParams, object : IDataCallBack<AlbumList> {
            override fun onSuccess(p0: AlbumList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.11 根据分类和标签获取某个分类某个标签下的热门专辑列表 (已过时)
     * @param category_id 分类ID，指定分类
     * @param tag_name 分类下对应专辑标签，不填则为热门分类
     * @param page 返回第几页，必须大于等于1，不填默认为1
     */
    fun getAlbums(category_id: Int, tag_name: String, page: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.TAG_NAME] = tag_name
        specificParams[DTransferConstants.PAGE] = page.toString()
        CommonRequest.getAlbums(specificParams, object : IDataCallBack<AlbumList> {
            override fun onSuccess(p0: AlbumList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.12 获取某个分类下的元数据列表。
     * @param category_id 分类ID，指定分类
     */
    fun getMetadataList(category_id: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        CommonRequest.getMetadataList(specificParams, object : IDataCallBack<MetaDataList> {
            override fun onSuccess(p0: MetaDataList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.2.13 获取某个分类的元数据属性键值组合下包含的热门专辑列表/最新专辑列表/最多播放专辑列表。
     * @param category_id 分类ID，指定分类，为0时表示热门分类
     * @param metadata_attributes 元数据属性列表：在/metadata/list接口得到的结果中，取不同元数据属性的attr_key和atrr_value组成任意个数的key-value键值，格式如：attr_key1:attr_value1;attr_key2:attr_value2;attr_key3:attr_value3
     * @param calc_dimension 计算维度，现支持最火（1），最新（2），经典或播放最多（3）
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getMetadataAlbumList(
        category_id: Int,
        metadata_attributes: String,
        calc_dimension: Int,
        page: Int,
        count: Int
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.METADATA_ATTRIBUTES] = metadata_attributes
        specificParams[DTransferConstants.CALC_DIMENSION] = calc_dimension.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getMetadataAlbumList(specificParams, object : IDataCallBack<AlbumList> {
            override fun onSuccess(p0: AlbumList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /********************************** 3.3 直播数据接口 ***********************************/
    /**
     * 3.3.1 获取直播省市列表
     */
    fun getProvinces() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getProvinces(specificParams, object : IDataCallBack<ProvinceList> {
            override fun onSuccess(p0: ProvinceList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.3.2 获取直播电台
     * @param radio_type 电台类型：1-国家台，2-省市台，3-网络台
     * @param province_code 省份代码，radio_type为2时不能为空
     * @param page 返回第几页，必须大于等于1，不填默认为1
     */
    fun getRadios(radio_type: Int, province_code: Int, page: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RADIOTYPE] = radio_type.toString()
        specificParams[DTransferConstants.PROVINCECODE] = province_code.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        CommonRequest.getRadios(specificParams, object : IDataCallBack<RadioList> {
            override fun onSuccess(p0: RadioList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.3.3 获取直播电台某一天的节目排期表
     * @param radio_id 直播电台ID
     * @param weekday 表示星期几，不填则取今天的星期。0-星期天，1-星期一，2-星期二，3-星期三，4-星期四，5-星期五，6-星期六
     */
    fun getSchedules(radio_id: Int, weekday: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RADIOID] = radio_id.toString()
        specificParams[DTransferConstants.WEEKDAY] = weekday.toString()
        CommonRequest.getSchedules(specificParams, object : IDataCallBack<ScheduleList> {
            override fun onSuccess(p0: ScheduleList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     *3.3.4 获取直播节目详情
     * @param radio_id 直播电台ID
     */
    fun getProgram(radio_id: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RADIOID] = radio_id.toString()
        CommonRequest.getProgram(specificParams, object : IDataCallBack<ProgramList> {
            override fun onSuccess(p0: ProgramList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.3.5 批量获取电台接口
     * @param ids 电台ID列表，以英文逗号分隔，比如"100,101,102"
     */
    fun getRadiosByIds(ids: String) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RADIO_IDS] = ids
        CommonRequest.getRadiosByIds(specificParams, object : IDataCallBack<RadioListById> {
            override fun onSuccess(p0: RadioListById?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.3.6 获取某省份城市列表。
     * @param province_code 省份code (国家行政规划的省代码)
     */
    fun getCitys(province_code: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.PROVINCECODE] = province_code.toString()

        CommonRequest.getCitys(specificParams, object : IDataCallBack<CityList> {
            override fun onSuccess(p0: CityList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.3.6 获取某个城市下的电台列表
     * @param city_code 城市code(国家行政规划的城市代码)
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过100
     */
    fun getRadiosByCity(city_code: Int, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CITY_CODE] = city_code.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getRadiosByCity(specificParams, object : IDataCallBack<RadioList> {
            override fun onSuccess(p0: RadioList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     *3.3.7 获取直播电台的分类。
     */
    fun getRadioCategory() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getRadioCategory(specificParams, object : IDataCallBack<RadioCategoryList> {
            override fun onSuccess(p0: RadioCategoryList?) {

            }

            override fun onError(p0: Int, p1: String?) {
            }

        })
    }

    /**
     * 3.3.8 根据电台分类获取直播电台数据。
     *@param radio_category_id 直播分类ID
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getRadiosByCategory(radio_category_id: Int, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RADIO_CATEGORY_ID] = radio_category_id.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getRadiosByCategory(
            specificParams,
            object : IDataCallBack<RadioListByCategory> {
                override fun onSuccess(p0: RadioListByCategory?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /********************************** 3.4 榜单数据接口 ***********************************/
    /**
     * 3.4.1 根据榜单类型获取榜单首页的榜单列表
     * @param rank_type 榜单类型，1-节目榜单
     */
    fun getRankList(rank_type: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RANK_TYPE] = rank_type.toString()
        CommonRequest.getRankList(
            specificParams,
            object : IDataCallBack<RankList> {
                override fun onSuccess(p0: RankList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.4.2 根据rank_key获取某个榜单下的专辑列表
     * @param rank_list_id 用于获取具体榜单列表的id,可通过3.4.1获得 新接口中传入的rank_list_id 是榜单列表的id ,Rank model中的 rankListId
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页的大小 ，范围为[1,200]，默认为20
     */
    fun getRankAlbumListNew(rank_list_id: String, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RANK_KEY] = rank_list_id
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getRankAlbumListNew(
            specificParams,
            object : IDataCallBack<RankAlbumList> {
                override fun onSuccess(p0: RankAlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.4.3 根据rank_key获取某个榜单下的声音列表
     * @param rank_key 用于获取具体榜单内容的key
     * @param page 返回第几页，必须大于等于1，不填默认为1
     */
    fun getRankTrackList(rank_key: String, page: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RANK_KEY] = rank_key
        specificParams[DTransferConstants.PAGE] = page.toString()
        CommonRequest.getRankTrackList(
            specificParams,
            object : IDataCallBack<RankTrackList> {
                override fun onSuccess(p0: RankTrackList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.4.4 获取直播电台排行榜
     * @param radio_count 需要获取排行榜中的电台数目。
     */
    fun getRankRadios(radio_count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RADIO_COUNT] = radio_count.toString()
        CommonRequest.getRankRadios(
            specificParams,
            object : IDataCallBack<RadioList> {
                override fun onSuccess(p0: RadioList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }
    /********************************** 3.5 听单数据接口 ***********************************/
    /**
     * 3.5.1 获取精品听单内容
     * @param page 返回第几页，必须大于等于1，不填默认为1
     */
    fun getColumnList(page: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.PAGE] = page.toString()
        CommonRequest.getColumnList(
            specificParams,
            object : IDataCallBack<ColumnList> {
                override fun onSuccess(p0: ColumnList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.5.2 获取某个听单详情，每个听单包含听单简介信息和专辑或声音的列表
     * 注意：听单会返回声音列表或者专辑列表，需要通过ColumnDetail中的column_content_type字段判断是声音列表还是专辑列表
     * 1 ：专辑
     * 2 ：声音
     * @param id 听单ID
     */
    fun getComlumnDetail(id: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ID] = id.toString()
        CommonRequest.getComlumnDetail(
            specificParams,
            object : IDataCallBack<ColumnDetail> {
                override fun onSuccess(p0: ColumnDetail?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }
    /********************************** 3.6 焦点图数据接口 ***********************************/
    /**
     * 3.6.1 获取榜单焦点图列表
     * @param id 听单ID
     */
    fun getRankBannerList(id: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ID] = id.toString()
        CommonRequest.getRankBannerList(
            specificParams,
            object : IDataCallBack<RankBannerList> {
                override fun onSuccess(p0: RankBannerList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.6.2 获取发现页推荐的焦点图列表
     * @param channel app的渠道号（对应渠道焦点图配置）
     * @param app_version app版本号
     * @param image_scale 控制焦点图图片大小参数，scale=2为iphone适配类型，scale=3为iphone6适配机型，对于Android一般设为2
     */
    fun getDiscoveryBannerList(channel: String, app_version: String, image_scale: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CHANNEL] = channel
        specificParams[DTransferConstants.APP_VERSION] = app_version
        specificParams[DTransferConstants.IMAGE_SCALE] = image_scale.toString()
        CommonRequest.getDiscoveryBannerList(
            specificParams,
            object : IDataCallBack<DiscoveryBannerList> {
                override fun onSuccess(p0: DiscoveryBannerList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.6.3 获取分类推荐的焦点图列表 (已过时 请使用3.6.4)
     * @param channel app的渠道号（对应渠道焦点图配置）
     * @param app_version app版本号
     * @param image_scale 控制焦点图图片大小参数，scale=2为iphone适配类型，scale=3为iphone6适配机型，对于Android一般设为2
     * @param category_id 分类ID
     * @param content_type 内容类型：暂时仅专辑(album)
     */
    fun getCategoryBannerList(
        channel: String,
        app_version: String,
        image_scale: Int,
        category_id: Int,
        content_type: String
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CHANNEL] = channel
        specificParams[DTransferConstants.APP_VERSION] = app_version
        specificParams[DTransferConstants.IMAGE_SCALE] = image_scale.toString()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.CONTENT_TYPE] = content_type
        CommonRequest.getCategoryBannerList(
            specificParams,
            object : IDataCallBack<CategoryBannerList> {
                override fun onSuccess(p0: CategoryBannerList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.6.4 获取v2版本的分类推荐的焦点图列表。
     * @param channel app的渠道号（对应渠道焦点图配置）
     * @param app_version app版本号
     * @param image_scale 控制焦点图图片大小参数，scale=2为iphone适配类型，scale=3为iphone6适配机型，对于Android一般设为2
     * @param category_id 分类ID
     * @param network 客户端网络类型：WIFI、4G、3G、2G，默认值为WIFI
     * @param operator 客户端移动运营商类型：0-中国移动；1-中国联通；2-中国电信；3-其他，可以不填
     * @param contains_paid 是否需要输出付费内容：true-是；false-否；（默认不输出付费内容）
     */
    fun getCategoryBannersV2(
        channel: String,
        app_version: String,
        image_scale: Int,
        category_id: Int,
        network: String,
        operator: Int,
        contains_paid: String
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CHANNEL] = channel
        specificParams[DTransferConstants.APP_VERSION] = app_version
        specificParams[DTransferConstants.IMAGE_SCALE] = image_scale.toString()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams["network"] = network
        specificParams["operator"] = operator.toString()
        specificParams[DTransferConstants.CONTAINS_PAID] = contains_paid.toString()
        CommonRequest.getCategoryBannersV2(
            specificParams,
            object : IDataCallBack<BannerV2List> {
                override fun onSuccess(p0: BannerV2List?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }
    /********************************** 3.7 冷启动接口 ***********************************/
    /**
     * 3.7.1 获取冷启动一级分类
     */
    fun getColdbootGenres() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getColdbootGenres(
            specificParams,
            object : IDataCallBack<GenreList> {
                override fun onSuccess(p0: GenreList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.7.2 获取冷启动二级分类
     */
    fun getColdbootSubGenres() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getColdbootSubGenres(
            specificParams,
            object : IDataCallBack<SubGenreList> {
                override fun onSuccess(p0: SubGenreList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.7.3 根据冷启动一级分类和冷启动二级分类获取相应类别下的冷启动标签列表
     * @param coldboot_genre 冷启动分类
     * @param coldboot_sub_genre 冷启动二级分类
     */
    fun getColdBootTag(coldboot_genre: String, coldboot_sub_genre: String) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.COLDBOOT_GENRE] = coldboot_genre
        specificParams[DTransferConstants.COLDBOOT_SUB_GENRE] = coldboot_sub_genre
        CommonRequest.getColdBootTag(
            specificParams,
            object : IDataCallBack<ColdBootTag> {
                override fun onSuccess(p0: ColdBootTag?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.7.4 提交用户感兴趣的冷启动标签
     * @param coldboot_genre 冷启动分类
     * @param coldboot_sub_genre 冷启动二级分类
     * @param coldboot_tags 用户勾选的感兴趣的冷启动标签列表
     */
    fun postColdBootTag(coldboot_genre: String, coldboot_sub_genre: String, coldboot_tags: String) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.COLDBOOT_GENRE] = coldboot_genre
        specificParams[DTransferConstants.COLDBOOT_SUB_GENRE] = coldboot_sub_genre
        specificParams[DTransferConstants.COLDBOOT_TAGS] = coldboot_tags
        CommonRequest.postColdBootTag(
            specificParams,
            object : IDataCallBack<PostResponse> {
                override fun onSuccess(p0: PostResponse?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.7.5 获取用户提交的冷启动标签详情
     */
    fun getColdBootDetail() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getColdBootDetail(
            specificParams,
            object : IDataCallBack<ColdBootDetail> {
                override fun onSuccess(p0: ColdBootDetail?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }
    /********************************** 3.8 主播数据接口 ***********************************/
    /**
     * 3.8.1 获取喜马拉雅主播分类
     */
    fun getAnnouncerCategoryList() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getAnnouncerCategoryList(
            specificParams,
            object : IDataCallBack<AnnouncerCategoryList> {
                override fun onSuccess(p0: AnnouncerCategoryList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.8.2 获取某个分类下的主播列表
     * @param vcategory_id 主播分类ID
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param calc_dimension 返回的主播列表排序规则，取值
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getAnnouncerList(vcategory_id: Int, page: Int, calc_dimension: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.VCATEGORY_ID] = vcategory_id.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams[DTransferConstants.CALC_DIMENSION] = calc_dimension.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getAnnouncerList(
            specificParams,
            object : IDataCallBack<AnnouncerList> {
                override fun onSuccess(p0: AnnouncerList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.8.3 获取主播的专辑列表
     * @param aid 主播用户ID
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过100
     */
    fun getAlbumsByAnnouncer(aid: Int, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.AID] = aid.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getAlbumsByAnnouncer(
            specificParams,
            object : IDataCallBack<AlbumList> {
                override fun onSuccess(p0: AlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.8.4 获取某个主播的声音列表
     * @param aid 主播用户ID
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过100
     */
    fun getTracksByAnnouncer(aid: Int, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.AID] = aid.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getTracksByAnnouncer(
            specificParams,
            object : IDataCallBack<AnnouncerTrackList> {
                override fun onSuccess(p0: AnnouncerTrackList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.8.5 根据一批主播ID批量获取主播信息
     * @param ids 主播用户ID列表 最大ID数量为200个，超过200的ID将忽略 例子：maps.put("ids" ,"1884830 ,38526903");
     */
    fun getAnnouncersBatch(ids: String) {
        val specificParams = HashMap<String, String>()
        specificParams["ids"] = ids
        CommonRequest.getAnnouncersBatch(
            specificParams,
            object : IDataCallBack<AnnouncerListByIds> {
                override fun onSuccess(p0: AnnouncerListByIds?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }
    /********************************** 3.9 搜索接口 ***********************************/
    /**
     * 3.9.1 搜索专辑
     * @param q 搜索关键词
     * @param category_id 分类ID，不填或者为0检索全库
     * @param calc_dimension 排序条件：2-最新，3-最多播放，4-最相关（默认）
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getSearchedAlbums(q: String, category_id: Int, calc_dimension: Int, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.SEARCH_KEY] = q
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams[DTransferConstants.CALC_DIMENSION] = calc_dimension.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getSearchedAlbums(
            specificParams,
            object : IDataCallBack<SearchAlbumList> {
                override fun onSuccess(p0: SearchAlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.9.2 搜索声音
     * @param q 搜索关键词
     * @param category_id 分类ID，不填或者为0检索全库
     * @param calc_dimension 排序条件：2-最新，3-最多播放，4-最相关（默认）
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getSearchedTracks(q: String, category_id: Int, calc_dimension: Int, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.SEARCH_KEY] = q
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams[DTransferConstants.CALC_DIMENSION] = calc_dimension.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getSearchedTracks(
            specificParams,
            object : IDataCallBack<SearchTrackList> {
                override fun onSuccess(p0: SearchTrackList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.9.3 搜索直播
     * @param q 搜索查询词参数
     * @param page 分页请求参数，表示请求第几页，默认为1即第一页
     * @param radio_category_id 直播分类ID
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getSearchedRadios(q: String, radio_category_id: Int, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.SEARCH_KEY] = q
        specificParams[DTransferConstants.RADIO_CATEGORY_ID] = radio_category_id.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getSearchedRadios(
            specificParams,
            object : IDataCallBack<RadioList> {
                override fun onSuccess(p0: RadioList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.9.4 获取最新热搜词
     * @param top 获取前top长度的热搜词。（1<=top<=20：目前top只支持最多20个）
     */
    fun getHotWords(top: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.TOP] = top.toString()
        CommonRequest.getHotWords(
            specificParams,
            object : IDataCallBack<HotWordList> {
                override fun onSuccess(p0: HotWordList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.9.5 获取某个关键词的联想词
     * @param q 搜索查询词参数
     */
    fun getSuggestWord(q: String) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.SEARCH_KEY] = q
        CommonRequest.getSuggestWord(
            specificParams,
            object : IDataCallBack<SuggestWords> {
                override fun onSuccess(p0: SuggestWords?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     *3.9.6 搜索主播
     * @param q 搜索关键词
     * @param calc_dimension 排序条件：4-最相关（默认），5-粉丝最多，6-声音最多
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getSearchAnnouncers(q: String, calc_dimension: Int, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.SEARCH_KEY] = q
        specificParams[DTransferConstants.CALC_DIMENSION] = calc_dimension.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getSearchAnnouncers(
            specificParams,
            object : IDataCallBack<AnnouncerList> {
                override fun onSuccess(p0: AnnouncerList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     *3.9.7 获取指定数量直播，声音，专辑的内容。
     * @param q 搜索关键词
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getSearchAll(q: String, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.SEARCH_KEY] = q
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getSearchAll(
            specificParams,
            object : IDataCallBack<SearchAll> {
                override fun onSuccess(p0: SearchAll?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.9.8 搜索专辑，支持的筛选条件包括专辑ID、标题、专辑所属主播ID或昵称、标签、是否付费、价格类型、分类ID或分类名等，并可指定排序字段。
     * @param id 专辑ID
     * @param title 专辑标题
     * @param uid 主播uid
     * @param nickname 主播昵称
     * @param tags 专辑标签
     * @param is_paid 是否付费 1-付费 0-免费
     * @param price_type 价格类型 1-分集购买 2-整张购买
     * @param category_id 专辑所属分类ID
     * @param category_name 分类名
     * @param sort_by 排序字段，可选值：created_at、updated_at、discountedPrice
     * @param desc true-降序排列 false-升序排列
     * @param page 返回第几页，从1开始，默认为1
     * @param count 每页大小，范围为[1,200]，默认为20
     */
    fun searchAlbumV2(
        id: Long,
        title: String,
        uid: Long,
        nickname: String,
        tags: String,
        is_paid: Int,
        price_type: Int,
        category_id: Long,
        category_name: String,
        sort_by: String,
        desc: Boolean,
        page: Int,
        count: Int
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ID] = id.toString()
        specificParams["title"] = title
        specificParams[DTransferConstants.UID] = uid.toString()
        specificParams[DTransferConstants.TAG] = tags
        specificParams["nickname"] = nickname
        specificParams["is_paid"] = is_paid.toString()
        specificParams["price_type"] = price_type.toString()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.CATEGORY_NAME] = category_name
        specificParams["sort_by"] = sort_by
        specificParams["desc"] = desc.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.searchAlbumV2(
            specificParams,
            object : IDataCallBack<SearchAlbumList> {
                override fun onSuccess(p0: SearchAlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.9.9 搜索声音，支持的筛选条件包括声音ID、标题、所属专辑ID、所属专辑标题、所属主播ID或昵称、标签、是否付费、分类ID或分类名等，并可指定排序字段。
     * @param id 声音ID
     * @param title 声音标题
     * @param album_id 所属专辑ID
     * @param album_title 所属专辑标题
     * @param uid 主播uid
     * @param nickname 主播昵称
     * @param tags 专辑标签
     * @param is_paid 是否付费 1-付费 0-免费
     * @param category_id 专辑所属分类ID
     * @param category_name 分类名
     * @param sort_by 排序字段，可选值：created_at、updated_at、discountedPrice
     * @param desc true-降序排列 false-升序排列
     * @param page 返回第几页，从1开始，默认为1
     * @param count 每页大小，范围为[1,200]，默认为20
     */
    fun searchTrackV2(
        id: Long,
        title: String,
        album_id: Long,
        album_title: String,
        uid: Long,
        nickname: String,
        tags: String,
        is_paid: Int,
        category_id: Long,
        category_name: String,
        sort_by: String,
        desc: Boolean,
        page: Int,
        count: Int
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ID] = id.toString()
        specificParams["title"] = title
        specificParams[DTransferConstants.ALBUM_ID] = album_id.toString()
        specificParams["album_title"] = album_title
        specificParams[DTransferConstants.UID] = uid.toString()
        specificParams[DTransferConstants.TAG] = tags
        specificParams["nickname"] = nickname
        specificParams["is_paid"] = is_paid.toString()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.CATEGORY_NAME] = category_name
        specificParams["sort_by"] = sort_by
        specificParams["desc"] = desc.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.searchTrackV2(
            specificParams,
            object : IDataCallBack<SearchTrackListV2> {
                override fun onSuccess(p0: SearchTrackListV2?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }
    /********************************** 3.10 推荐接口 ***********************************/
    /**
     * 3.10.1 获取运营人员在发现页配置的分类维度专辑推荐模块的列表
     * 对应如下喜马拉雅App功能： 喜马拉雅发现页的推荐标签页下的听新闻、听小说、听脱口秀等内容
     * @param display_count 每个分类维度专辑推荐模块包含的专辑数，不填则默认为3，取值区间为[1, 20]
     */
    fun getDiscoveryRecommendAlbums(display_count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.DISPLAY_COUNT] = display_count.toString()
        CommonRequest.getDiscoveryRecommendAlbums(
            specificParams,
            object : IDataCallBack<DiscoveryRecommendAlbumsList> {
                override fun onSuccess(p0: DiscoveryRecommendAlbumsList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.10.2 获取运营人员为某个分类配置的标签维度专辑推荐模块列表
     * 对应如下喜马拉雅App功能：
     * 从喜马拉雅发现页点击某个分类（如有声小说），然后在该分类下选择“推荐”标签页，
     * 该标签页下有一些运营人员配置的专辑推荐模块（如有声小说下有热播小说、女生最爱、 男生最爱等专辑推荐模块）`
     * @param category_id 分类ID，指定分类
     * @param display_count 每个专辑推荐模块默认显示的专辑数，不填则默认为3，取值区间为[1, 20]
     */
    fun getCategoryRecommendAlbums(category_id: Int, display_count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CATEGORY_ID] = category_id.toString()
        specificParams[DTransferConstants.DISPLAY_COUNT] = display_count.toString()
        CommonRequest.getCategoryRecommendAlbums(
            specificParams,
            object : IDataCallBack<CategoryRecommendAlbumsList> {
                override fun onSuccess(p0: CategoryRecommendAlbumsList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.10.3 获取某个专辑的相关推荐
     * @param albumId 要搜索获得相关推荐的专辑id
     */
    fun getRelativeAlbums(albumId: Long) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ALBUMID] = albumId.toString()
        CommonRequest.getRelativeAlbums(
            specificParams,
            object : IDataCallBack<RelativeAlbums> {
                override fun onSuccess(p0: RelativeAlbums?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.10.4 获取下载听模块的推荐下载专辑
     * @param calc_dimension 计算维度，现支持经典（0），最火（1），最新（2），播放最多（3）
     * @param page 返回第几页，必须大于等于1，不填默认为1
     */
    fun getRecommendDownloadList(calc_dimension: Int, page: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CALC_DIMENSION] = calc_dimension.toString()
        specificParams[DTransferConstants.PAGE] = page.toString()
        CommonRequest.getRecommendDownloadList(
            specificParams,
            object : IDataCallBack<RecommendDownload> {
                override fun onSuccess(p0: RecommendDownload?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.10.5 获取某个声音的相关推荐专辑
     * @param trackId 要获得相关推荐的声音id
     */
    fun getRelativeAlbumsUseTrackId(trackId: Long) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.TRACKID] = trackId.toString()
        CommonRequest.getRelativeAlbumsUseTrackId(
            specificParams,
            object : IDataCallBack<RelativeAlbums> {
                override fun onSuccess(p0: RelativeAlbums?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.10.6 获取猜你喜欢专辑
     * @param like_count 返回几条，不填则默认为3，取值区间为[1, 50]
     */
    fun getGuessLikeAlbum(like_count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.LIKE_COUNT] = like_count.toString()
        CommonRequest.getGuessLikeAlbum(
            specificParams,
            object : IDataCallBack<GussLikeAlbumList> {
                override fun onSuccess(p0: GussLikeAlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }
    /********************************** 3.13 用户播放历史接口 ***********************************/
    /**
     * 3.13.1 根据用户ID获取用户播放云历史记录
     * 根据用户ID获取用户播放云历史记录（包括用户是否播放过这些声音，以及播放到什么位置等信息）。目前只对点播音频做云历史。（每个用户历史记录的上限是100条）
     * 限制！！！ 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     */
    fun getPlayHistoryByUid() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getPlayHistoryByUid(
            specificParams,
            object : IDataCallBack<PlayHistoryList> {
                override fun onSuccess(p0: PlayHistoryList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.13.2 用户上传播放云历史记录
     * @param content_type 1-点播（不传时候的默认值），2-广播
     * @param album_id content_type=1时候必填，表示专辑ID
     * @param track_id content_type=1时候必填，为声音ID，表示具体播放专辑里哪条声音
     * @param radio_id content_type=2时候必填，表示广播电台ID
     * @param schedule_id content_type=2时候必填，表示收听的广播节目时间表ID
     * @param break_second 相对于音频开始位置的播放跳出位置，单位为秒。比如当前音频总时长60s，本次播放到音频第25s处就退出或者切到下一首，那么break_second就是25
     * @param play_begin_at 开始播放时刻，Unix毫秒数时间戳
     * @param play_end_at 结束播放时刻，Unix毫秒数时间戳
     */
    fun uploadHistory(
        content_type: Int,
        album_id: Int,
        track_id: Int,
        radio_id: Int,
        schedule_id: Int,
        break_second: Int,
        play_begin_at: Long,
        play_end_at: Long
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.CONTENT_TYPE] = content_type.toString()
        specificParams[DTransferConstants.ALBUM_ID] = album_id.toString()
        specificParams[DTransferConstants.TRACK_ID] = track_id.toString()
        specificParams[DTransferConstants.RADIOID] = radio_id.toString()
        specificParams["schedule_id"] = schedule_id.toString()
        specificParams["break_second"] = break_second.toString()
        specificParams["play_begin_at"] = play_begin_at.toString()
        specificParams["play_end_at"] = play_end_at.toString()
        CommonRequest.uploadHistory(
            specificParams,
            object : IDataCallBack<PostResponse> {
                override fun onSuccess(p0: PostResponse?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.13.3 用户批量上传播放云历史记录
     * 限制！！！ 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     * @param play_history_records Json Array 需要上传的播放数据列表，每条播放数据包含下列字段：
     *                                          content_type：1-点播，2-广播
     *                                          album_id：content_type=1时候必填，播放的专辑ID
     *                                          track_id：content_type=1时候必填，声音ID，表示具体播放专辑里哪条声音
     *                                          radio_id：content_type=2时候必填，表示广播电台ID
     *                                          schedule_id：content_type=2时候必填，表示收听的广播节目时间表ID
     *                                          break_second: 相对于音频开始位置的播放跳出位置，单位为秒。比如当前音频总时长60s，本次播放到音频第25s处就退出或者切到下一首，那么break_second就是25
     *                                          play_begin_at：开始播放时刻，Unix毫秒数时间戳
     *                                          play_end_at：结束播放时刻，Unix毫秒数时间戳
     */
    fun batchUploadHistory(play_history_records: String) {
        val specificParams = HashMap<String, String>()
        specificParams["play_history_records"] = play_history_records
        CommonRequest.batchUploadHistory(
            specificParams,
            object : IDataCallBack<PostResponse> {
                override fun onSuccess(p0: PostResponse?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.13.4 用户批量删除播放云历史记录
     * 限制！！！ 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     * @param play_history_records Json Array    点播播放历史数据列表：
     *                                           content_type：1-点播，2-广播
     *                                           album_id：content_type=1时不为空，表示专辑ID
     *                                           track_id: content_type=1时不为空，表示声音ID
     *                                           radio_id：content_type=2时不为空，表示电台ID
     *                                           schedule_id: content_type=2时不为空，表示电台播放节目时间表ID
     *                                           deleted_at：删除发生的时间点
     */
    fun batchDeleHistory(play_history_records: String) {
        val specificParams = HashMap<String, String>()
        specificParams["play_history_records"] = play_history_records
        CommonRequest.batchDeleHistory(
            specificParams,
            object : IDataCallBack<PostResponse> {
                override fun onSuccess(p0: PostResponse?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /********************************** 3.14 用户订阅接口 ***********************************/

    /**
     * 3.14.1 获取喜马拉雅用户的动态更新的订阅专辑列表
     * 限制！！！ 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     * @param updated_at Unix毫秒时间戳，表示获取updated_at更新时间点之前更新的offset条订阅专辑；（为0表示从当前时间点最新更新的第一条订阅专辑开始获取）
     * @param offset 拉取updated_at时间点之前更新的订阅专辑数目，默认20，最多不超过200
     */
    fun getAlbumByUid(updated_at: Long, offset: Int) {
        val specificParams = HashMap<String, String>()
        specificParams["updated_at"] = updated_at.toString()
        specificParams["offset"] = offset.toString()
        CommonRequest.getAlbumByUid(
            specificParams,
            object : IDataCallBack<SubscribeAlbumList> {
                override fun onSuccess(p0: SubscribeAlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.14.2 用户新增或取消已订阅专辑
     * 限制！！！ 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     * @param operation_type 操作类型，现支持删除（0），新增（1）
     * @param album_id 需要更新的订阅专辑ID
     */
    fun AddOrDelSubscribe(operation_type: Int, album_id: Int) {
        val specificParams = HashMap<String, String>()
        specificParams["operation_type"] = operation_type.toString()
        specificParams[DTransferConstants.ALBUM_ID] = album_id.toString()
        CommonRequest.AddOrDelSubscribe(
            specificParams,
            object : IDataCallBack<PostResponse> {
                override fun onSuccess(p0: PostResponse?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     *3.14.3 用户批量新增已订阅专辑
     * @param ids 需要更新的订阅专辑ID列表，用英文逗号分隔，例如1001,1002,1003
     */
    fun batchAddSubscribe(ids: Int) {
        val specificParams = HashMap<String, String>()
        specificParams["ids"] = ids.toString()
        CommonRequest.batchAddSubscribe(
            specificParams,
            object : IDataCallBack<PostResponse> {
                override fun onSuccess(p0: PostResponse?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /********************************** 3.15 喜马拉雅付费内容接口 ***********************************/
    /**
     * 3.15.1 获取所有付费专辑
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getAllPaidAlbums(page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getAllPaidAlbums(
            specificParams,
            object : IDataCallBack<AlbumList> {
                override fun onSuccess(p0: AlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.2 获取付费精品分类下的标签（或者叫热词）列表
     */
    fun getPaidTags() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getPaidTags(
            specificParams,
            object : IDataCallBack<TagList> {
                override fun onSuccess(p0: TagList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.3 根据付费精品分类下的标签（或者叫热词）获取热门付费专辑列表
     * @param tag_name 付费精品分类下的标签（或者叫热词）：传空获取到的是热门推荐专辑列表
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getPaidAlbumByTag(tag_name: String, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.TAG_NAME] = tag_name
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getPaidAlbumByTag(
            specificParams,
            object : IDataCallBack<AlbumList> {
                override fun onSuccess(p0: AlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.4 分页获取付费专辑下的声音列表（即分页浏览付费专辑下的声音列表）
     * @param album_id 付费专辑ID
     * @param sort "asc"表示喜马拉雅正序，"desc"表示喜马拉雅倒序，"time_asc"表示时间升序，"time_desc"表示时间降序，默认为"asc"
     * @param page 当前第几页，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     * @param contains_track_rich_intro 为true时，返回的声音列表包含富文本信息
     */
    fun getPaidTrackByAlbum(
        album_id: Int,
        sort: String,
        page: Int,
        count: Int,
        contains_track_rich_intro: String
    ) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.SORT] = sort
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams[DTransferConstants.ALBUM_ID] = album_id.toString()
        specificParams["contains_track_rich_intro"] = contains_track_rich_intro
        specificParams["count"] = count.toString()
        CommonRequest.getPaidAlbumByTag(
            specificParams,
            object : IDataCallBack<AlbumList> {
                override fun onSuccess(p0: AlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.5 批量根据付费专辑ID获取付费专辑详情
     * @param ids 付费专辑ID列表，传参时用英文逗号分隔，最大ID数量为200个，超过200的ID将忽略。
     */
    fun batchGetPaidAlbum(ids: Int) {
        val specificParams = HashMap<String, String>()
        specificParams["ids"] = ids.toString()
        CommonRequest.batchGetPaidAlbum(
            specificParams,
            object : IDataCallBack<BatchAlbumList> {
                override fun onSuccess(p0: BatchAlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.6 批量根据付费声音ID获取付费声音详情
     * @param ids 付费声音ID列表，传参时用英文逗号分隔，最大ID数量为200个，超过200的ID将忽略。
     */
    fun batchPaidTracks(ids: Int) {
        val specificParams = HashMap<String, String>()
        specificParams["ids"] = ids.toString()
        CommonRequest.batchPaidTracks(
            specificParams,
            object : IDataCallBack<BatchTrackList> {
                override fun onSuccess(p0: BatchTrackList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     *3.15.7 获取所有付费内容排行榜（付费专辑榜或付费声音榜）基础信息
     */
    fun getPaidRank() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getPaidRank(
            specificParams,
            object : IDataCallBack<RankList> {
                override fun onSuccess(p0: RankList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.8 根据rank_key分页获取某个付费专辑排行榜下的付费专辑列表
     * @param rank_key 用于获取具体付费榜单内容的key
     * @param page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun getRankAlbums(rank_key: String, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.RANK_KEY] = rank_key
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.getRankAlbums(
            specificParams,
            object : IDataCallBack<AlbumList> {
                override fun onSuccess(p0: AlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.9 获取用户购买过的所有付费专辑
     * （包括整张购买过的专辑，和购买过分集声音所属的专辑）。
     * 限制： 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     */
    fun getBoughtAlbums() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getBoughtAlbums(
            specificParams,
            object : IDataCallBack<AlbumList> {
                override fun onSuccess(p0: AlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.10 根据用户ID和一批付费专辑ID获取用户对这批付费专辑的购买状态
     * （注意：只有整张购买的专辑，才会显示为已购状态！）
     * 限制： 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     * @param ids 英文逗号分隔的付费专辑ID，id总数不能超过200
     */
    fun getBoughtAlbumStatus(ids: Int) {
        val specificParams = HashMap<String, String>()
        specificParams["ids"] = ids.toString()
        CommonRequest.getBoughtAlbumStatus(
            specificParams,
            object : IDataCallBack<BoughtStatuList> {
                override fun onSuccess(p0: BoughtStatuList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.11 根据用户ID和一批付费声音ID获取用户对这批付费声音的购买状态
     * 限制： 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     * @param ids 英文逗号分隔的付费声音ID，id总数不能超过200
     */
    fun getBoughtTrackStatus(ids: Int) {
        val specificParams = HashMap<String, String>()
        specificParams["ids"] = ids.toString()
        CommonRequest.getBoughtTrackStatus(
            specificParams,
            object : IDataCallBack<BoughtStatuList> {
                override fun onSuccess(p0: BoughtStatuList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.12 根据关键词搜索付费专辑
     * @param q 搜索关键词
     * @param  page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun searchPaidAlbums(q: String, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.SEARCH_KEY] = q
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.searchPaidAlbums(
            specificParams,
            object : IDataCallBack<AlbumList> {
                override fun onSuccess(p0: AlbumList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.13 根据关键词搜索付费声音
     * @param q 搜索关键词
     * @param  page 返回第几页，必须大于等于1，不填默认为1
     * @param count 每页多少条，默认20，最多不超过200
     */
    fun searchPaidTracks(q: String, page: Int, count: Int) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.SEARCH_KEY] = q
        specificParams[DTransferConstants.PAGE] = page.toString()
        specificParams["count"] = count.toString()
        CommonRequest.searchPaidTracks(
            specificParams,
            object : IDataCallBack<TrackList> {
                override fun onSuccess(p0: TrackList?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.17 根据专辑ID获取专辑下的所有声音ID列表
     * @param album_id 专辑ID
     * @param sort "asc"表示喜马拉雅正序，"desc"表示喜马拉雅倒序，"time_asc"表示时间升序，"time_desc"表示时间降序，默认为"asc"
     * @param third_uid 合作方第三方用户唯一标识；
     */
    fun getTrackStatuesByAlbumId(album_id: Int, sort: String, third_uid: String) {
        val specificParams = HashMap<String, String>()
        specificParams[DTransferConstants.ALBUM_ID] = album_id.toString()
        specificParams[DTransferConstants.SORT] = sort
        specificParams["third_uid"] = third_uid
        CommonRequest.getTrackStatuesByAlbumId(
            specificParams,
            object : IDataCallBack<XmAlbumTracksStatue> {
                override fun onSuccess(p0: XmAlbumTracksStatue?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.19 取消订单
     * @param third_uid 合作方第三方账号唯一标识
     * @param xima_order_no 喜马拉雅订单号
     */
    fun clientCancelOrder(third_uid: String, xima_order_no: String) {
        val specificParams = HashMap<String, String>()
        specificParams["xima_order_no"] = xima_order_no
        specificParams["third_uid"] = third_uid
        CommonRequest.clientCancelOrder(
            specificParams,
            object : IDataCallBack<PayOderStatue> {
                override fun onSuccess(p0: PayOderStatue?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.15.20 获取订单详情
     */
    fun getOrderDetail(third_uid: String, xima_order_no: String) {
        val specificParams = HashMap<String, String>()
        specificParams["third_uid"] = third_uid
        specificParams["xima_order_no"] = xima_order_no
        CommonRequest.getOrderDetail(
            specificParams,
            object : IDataCallBack<OrderDetail> {
                override fun onSuccess(p0: OrderDetail?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }
    /********************************** 3.16 用户相关接口 ***********************************/
    /**
     * 3.16.1 根据用户ID获取用户基本信息
     * 限制： 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     */
    fun getBaseUserInfo() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getBaseUserInfo(
            specificParams,
            object : IDataCallBack<XmBaseUserInfo> {
                override fun onSuccess(p0: XmBaseUserInfo?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

    /**
     * 3.16.2 根据用户ID获取用户画像资料
     * 限制： 用户必须处于登陆状态（用户进行过OAuth2服务端标准登陆授权，具体请参考喜马拉雅-OAuth2标准授权接口文档）
     */
    fun getUserInfo() {
        val specificParams = HashMap<String, String>()
        CommonRequest.getUserInfo(
            specificParams,
            object : IDataCallBack<XmUserInfo> {
                override fun onSuccess(p0: XmUserInfo?) {

                }

                override fun onError(p0: Int, p1: String?) {
                }

            })
    }

}